import java.io.IOException;
import java.net.*;
import java.util.Scanner;

// 客户端
public class UdpEchoClient {
    // 定义一个 socket 对象
    // 网络通信, 必须要 socket 对象
    private DatagramSocket datagramSocket = null;
    private String serverIP;
    private int serverPort;

    // 与服务器不同, 不需要绑定/关联端口, 系统会自动分配
    // 但是需要知道服务器在哪, 服务器的 ip 和 端口
    public UdpEchoClient(String serverIP, int serverPort) throws SocketException {
        datagramSocket = new DatagramSocket();
        this.serverIP = serverIP;
        this.serverPort = serverPort;
    }

    public void start() throws IOException {
        // 用来存放 客户端要发送的请求
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.print("-> ");
            // 从控制台读取一个字符串, 请求数据
            String request = scanner.next();

            // 将数据构造成 udp 数据报
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), request.getBytes().length,
                    InetAddress.getByName(serverIP), serverPort);
            // DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), request.getBytes().length,
            //        new InetSocketAddress(InetAddress.getByName(serverIP), serverPort));

            // 发送数据报
            datagramSocket.send(requestPacket);

            // 用来接收服务器的响应
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096], 4096);
            // 接收服务器的响应
            datagramSocket.receive(responsePacket);
            // 转为字符串
            String response = new String(responsePacket.getData(), 0, responsePacket.getLength());

            System.out.printf("[%s:%d] resp: %s\n", responsePacket.getAddress().toString(), responsePacket.getPort(), response);
        }
    }

    public static void main(String[] args) throws IOException {
        // 127.0.0.1 在同一个主机上, 环回ip
        UdpEchoClient udpEchoClient = new UdpEchoClient("127.0.0.1", 6666);
        udpEchoClient.start();
    }
}
